
//
// a doubly linked lists
//

#ifndef DLIST_H
#define DLIST_H

//
struct Node;
typedef struct Node *dlist;

// call back function
// return 1 if success on doing something
// return 0 if failed on doing something
typedef int (*DoSomeThingCB)(dlist dl, void *context);

//
// call back function for debug
//
typedef void (*PrintCB)(void *value);

//
// create a double link
//
dlist dl_create(void);

//
// destroy a double link
// dl: beginning of double link list
//
void dl_destroy(dlist dl);

//
// add a new value after a specified
// double link list node
//
void *dl_add_after(dlist dl, void *value);

//
// remove a node after a specified
// double link list node
//
void *dl_remove_after(dlist dl);

//
// return next node
//
dlist dl_next(dlist dl);

//
// return value in node
//
void* dl_get_value(dlist dl);

//
// print all values in double list
//
void dl_print(dlist start, PrintCB cb);

//
// traverse each node in list
// do something(callback) for each node
// return 0 if error happened
// return 1 if done successfully
//
int dl_foreach(dlist dl, DoSomeThingCB cb, void *ctx);

#endif // DLIST_H
